/**
 * 给定N个数组，每个数组均有M个数
 * 求满足条件的数组对(Ai, Aj)，数组Ai和Aj中，满足Aik==Ajk的数量是奇数
 * 朴素的做法显然是O(N^2 * M)
 * for i in N:
 *     for j in N:
 *         在O(M)的时间内检查Ai和Aj是否符合要求
 * 
 * 改变一下枚举的顺序
 * 
 * 首先令Bij记录数组ij相等元素的数量
 * for pos in M: # pos是位置编号
 *     for i in N:
 *         将i放到对应的A[i][pos]权值指定的数组中
 *     for i in N:
 *         将A[i][pos]对应的权值数组中的所有j，令 Bij ^= 1，因为只要奇偶性
 *     for i in N:
 *         消除pos位置的影响
 * 此时检查Bi中1的数量，就知道与数组i有奇数个元素相等的数组的数量。也就可以得到答案。 *              
 * 内重循环的第二个循环中的操作，最差是O(N)的，因此整个过程还是O(M*N^2)的，但是写成这样就有了优化的可能
 *        
 * 将权值数组写成bitset，令Bi也是bitset，Bij记录了数组i与数组j相等元素的奇偶性
 * for pos in M:
 *     for i in N:
 *         C[A[i][pos]].set(i)
 *     for i in N:
 *         B[i] ^= C[A[i][pos]] # 这里优化了
 *     for i in N:
 *         C[A[i][pos]].reset(i)
 * 然后统计Bi的count即可。注意排除掉自身的影响，还要除以2
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using bt = bitset<2000>;
using vbt = vector<bt>;

int N, M;
vector<vector<int>> A;

vbt B;
array<bt, 1000> C;

void work(){    
    cin >> N >> M;
    A.assign(N, vector<int>(M, 0));
    for(auto & a : A)for(auto & i : a) cin >> i;

    B.assign(N, {});
    for(int i=0;i<M;++i){
        for(int j=0;j<N;++j){
            C[A[j][i]].set(j);
        }
        for(int j=0;j<N;++j){
            B[j] ^= C[A[j][i]];
        }
        for(int j=0;j<N;++j){
            C[A[j][i]].reset(j);
        }
    }

    int ans = 0;
    for(auto & b : B) ans += b.count();
    if(M & 1) ans -= N;
    ans >>= 1;
    cout << ans << endl;
    return;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}